"1.c++、java代码以及执行shell脚本，按“F8”可进行C、C++代码的调试
"2.自动插入文件头 ，新建C、C++源文件时自动插入表头：包括文件名、作者、联系方式、建立时间等，读者可根据需求自行更改
"3.映射“Ctrl + A”为全选并复制快捷键，方便复制代码
"4.按“F2”可以直接消除代码中的空行
"5.“F3”可列出当前目录文件，打开树状文件目录
"6. 支持鼠标选择、方向键移动
"7. 代码高亮，自动缩进，显示行号，显示状态行
"8.按“Ctrl + P”可自动补全
"9.[]、{}、()、""、' '等都自动补全
""10.其他功能读者可以研究以下文件
" 显示相关 
"""""""""""""""""""
set shortmess=atI " 启动的时候不显示那个援助乌干达儿童的提示 
"winpos 5 5 " 设定窗口位置 
"set lines=40 columns=155 " 设定窗口大小 
"set nu " 显示行号 
"set go= " 不要图形按钮
set nu

colo evening
set guifont=Courier_New:h10:cANSI " 设置字体 
syntax on " 语法高亮 
autocmd InsertLeave * se nocul " 用浅色高亮当前行 
autocmd InsertEnter * se cul " 用浅色高亮当前行 
"set ruler " 显示标尺 
set showcmd " 输入的命令显示出来，看的清楚些 
"set cmdheight=1 " 命令行（在状态行下）的高度，设置为1 
"set whichwrap+=<,>,h,l " 允许backspace和光标键跨越行边界(不建议) 
"set scrolloff=3 " 光标移动到buffer的顶部和底部时保持3行距离 
set novisualbell " 不要闪烁(不明白) 
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} "状态行显示的内容 
set laststatus=1 " 启动显示状态行(1),总是显示状态行(2) 
"set foldenable " 允许折叠 
"set foldmethod=manual " 手动折叠 
"set background=dark "背景使用黑色 
set nocompatible "去掉讨厌的有关vi一致性模式，避免以前版本的一些bug和局限 
" 显示中文帮助
if version >= 603
set helplang=cn
set encoding=utf-8
endif
" 设置配色方案
"colorscheme murphy
"字体 
"if (has("gui_running")) 
" set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 
"endif
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
"""""""""""""""""""""""""
"""""新文件标题""""""""""
"新建.c,.h,.sh,.java文件，自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
     ""定义函数SetTitle，自动插入文件头 
func SetTitle() 
     "如果文件类型为.sh文件 
     if &filetype == 'cpp'
     call setline(1, " /********************************************************************") 
     call append(line("."),   " # File Name:    ".expand("%")) 
     call append(line(".")+1, " # Version:      1.0") 
     call append(line(".")+2, " # Mail:         shiyanhk@gmail.com ") 
     call append(line(".")+3, " # Created Time: ".strftime("%Y-%m-%d")) 
     call append(line(".")+4, " *********************************************************************/") 
     call append(line(".")+5, "")
     call append(line(".")+6, "#include <iostream>")
     call append(line(".")+7, "using namespace std;")
     call append(line(".")+8, "")
"     call append(line(".")+9, "class T")
"     call append(line(".")+10, "{")
""     call append(line(".")+11, "public:")
"     call append(line(".")+12, "protected:")
"     call append(line(".")+13, "private:")
"     call append(line(".")+14, "};")
"     call append(line(".")+15, "")
"     call append(line(".")+16, "int main(int argc,char ** argv)")
"     call append(line(".")+17, "{")
"     call append(line(".")+18, "     return 0;")
"     call append(line(".")+19, "}")
     elseif &filetype == 'c'
     call setline(1, " /**********************************************************************") 
     call append(line("."),   " # File Name:   ".expand("%")) 
     call append(line(".")+1, " # Version:     1.0") 
     "call append(line(".")+2, " # Mail:        ") 
     call append(line(".")+2, " # Mail:        shiyanhk@gmail.com ") 
     call append(line(".")+3, " # Created Time: ".strftime("%Y-%m-%d%t")) 
     call append(line(".")+4, " ************************************************************************/") 
     call append(line(".")+5, "#include <stdio.h>")
     call append(line(".")+6, "")
     call append(line(".")+7, "int main(int argc,char **argv)")
     call append(line(".")+8, "{")
     call append(line(".")+9, "     return 0;")
     call append(line(".")+10, "}")
     call append(line(".")+11, "")
     endif
     "新建文件后，自动定位到文件尾
     autocmd BufNewFile * normal G
     endfunc 
     """""""""""""""""""""""""""""""
     "键盘命令
     """""""""""""""""""""""""""""""
     nmap <leader>w :w!<cr>
     nmap <leader>f :find<cr>
     " 映射全选+复制 ctrl+a
     map <C-A> ggVGY
     map! <C-A> <Esc>ggVGY
     map <F12> gg=G
     " 选中状态下 Ctrl+c 复制
     vmap <C-c> "+y
     "去空行 
     nnoremap <F2> :g/^\s*$/d<CR> 
     "比较文件 
     nnoremap <C-F2> :vert diffsplit 
     "新建标签 
     map <M-F2> :tabnew<CR> 
     "列出当前目录文件 
     map <F3> :tabnew .<CR> 
     "打开树状文件目录 
     map <C-F3> \be 
     "C，C++ 按F5编译运行
     map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
     exec "w"
     if &filetype == 'c'
     exec "!g++ % -o %<"
     exec "! ./%<"
     elseif &filetype == 'cpp'
     exec "!g++ % -o %<"
     exec "! ./%<"
     elseif &filetype == 'java' 
     exec "!javac %" 
     exec "!java %<"
     elseif &filetype == 'sh'
     :!./%
     endif
     endfunc
     map <F6> :call FormartSrc()<CR><CR>
     func FormartSrc()
          exec "w"
          if &filetype == 'c'
               exec "!astyle --style=ansi -a --suffix=none %"
          elseif &filetype == 'cpp' || &filetype == 'hpp'
               exec "r !astyle --style=ansi --one-line=keep-statements -a --suffix=none %> /dev/null 2>&1"
          elseif &filetype == 'perl'
               exec "!astyle --style=gnu --suffix=none %"
          elseif &filetype == 'py'||&filetype == 'python'
               exec "r !autopep8 -i --aggressive %"
          elseif &filetype == 'java'
               exec "!astyle --style=java --suffix=none %"
          elseif &filetype == 'jsp'
               exec "!astyle --style=gnu --suffix=none %"
          elseif     &filetype == 'xml'
               exec "!astyle --style=gnu --suffix=none %"
          else
               exec "normal gg=G"
               return
          endif
          exec "e! %"
     endfunc
     
     "C,C++的调试
     map <F8> :call Rungdb()<CR>
func! Rungdb()
     exec "w"
     exec "!g++ % -g -o %<"
     exec "!gdb ./%<"
     endfunc
     """"""""""""""""""""""""
     ""实用设置
     """"""""""""""""""""""""
     " 设置当文件被改动时自动载入
     set autoread
     " quickfix模式
     autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>"代码补全 
     set completeopt=preview,menu      "允许插件 
     filetype plugin on     "共享剪贴板 
     set clipboard+=unnamed "从不备份 
     set nobackup
     "make 运行
     :set makeprg=g++\ -Wall\ \ %
     "自动保存
     set autowrite
     set ruler " 打开状态栏标尺
     "set cursorline " 突出显示当前行
     set magic " 设置魔术
     set guioptions-=T " 隐藏工具栏
     set guioptions-=m " 隐藏菜单栏
     "set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
          " 设置在状态行显示的信息
""          set foldcolumn=0
""          set foldmethod=indent 
""          set foldlevel=3 
""          set foldenable " 开始折叠
          " 不要使用vi的键盘模式，而是vim自己的
          set nocompatible
          " 语法高亮
          set syntax=on
          " 去掉输入错误的提示声音
          set noeb
          " 在处理未保存或只读文件的时候，弹出确认
          set confirm
          " 自动缩进
          set autoindent
          set cindent
          " Tab键的宽度
          set tabstop=4
          " 统一缩进为4
          set softtabstop=4
          set shiftwidth=4
          " 不要用空格代替制表符
          "set noexpandtab
          " 在行和段开始处使用制表符
          " set smarttab
          " 显示行号
          " set number
          " 历史记录数
          set history=1000
          "禁止生成临时文件
          set nobackup
          set noswapfile
          "搜索忽略大小写
          set ignorecase
          "搜索逐字符高亮
          set hlsearch
          set incsearch
          "行内替换
          set gdefault
          "编码设置
          set enc=utf-8
          set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
          "语言设置
          set langmenu=zh_CN.UTF-8
          set helplang=cn
          " 我的状态行显示的内容（包括文件类型和解码）
          "set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
          "set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
          " 总是显示状态行
          set laststatus=2
          " 命令行（在状态行下）的高度，默认为1，这里是2
          set cmdheight=2
          " 侦测文件类型
          filetype on
          " 载入文件类型插件
          filetype plugin on
          " 为特定文件类型载入相关缩进文件
          filetype indent on
          " 保存全局变量
          set viminfo+=!
          " 带有如下符号的单词不要被换行分割
          set iskeyword+=_,$,@,%,#,-
          " 字符间插入的像素行数目
         "set linespace=0
          " 增强模式中的命令行自动完成操作
          set wildmenu
          " 使回格键（backspace）正常处理indent, eol, start等
          set backspace=2
          " 允许backspace和光标键跨越行边界
          set whichwrap+=<,>,h,l
          " 可以在buffer的任何地方使用鼠标（类似office中在工作区双击鼠标定位）
          set mouse=a
          set selection=exclusive
          set selectmode=mouse,key
          " 通过使用: commands命令，告诉我们文件的哪一行被改变过
          set report=0
          " 在被分割的窗口间显示空白，便于阅读
          set fillchars=vert:\ ,stl:\ ,stlnc:\  "高亮显示匹配的括号
         set showmatch " 匹配括号高亮的时间（单位是十分之一秒）
         set matchtime=1  " 光标移动到buffer的顶部和底部时保持3行距离
          set scrolloff=3            " 为C程序提供自动缩进
          set smartindent            " 高亮显示普通txt文件（需要txt.vim脚本）
     
          
     ""     au BufRead,BufNewFile * setfiletype txt
     ""     "自动补全
     ""     :inoremap ( ()<ESC>i
     ""     :inoremap ) <c-r>=ClosePair(')')<CR>
     ""     :inoremap { {<CR>}<ESC>O
     ""     :inoremap } <c-r>=ClosePair('}')<CR>
     ""     :inoremap [ []<ESC>i
     ""     :inoremap ] <c-r>=ClosePair(']')<CR>
     ""     :inoremap " ""<ESC>i
     ""     :inoremap ' ''<ESC>i
     ""     :inoremap / /**/<ESC>i

     function! ClosePair(char)
     if getline('.')[col('.') - 1] == a:char
     return "\<Right>"
     else
     return a:char
     endif
     endfunction
     filetype plugin indent on 
     "打开文件类型检测, 加了这句才可以用智能补全
     set completeopt=longest,menu
     """"""""""""""""""""""""""""""""
     " CTags的设定 
     """"""""""""""""""""""""""""""""
   "  let Tlist_Sort_Type = "name" " 按照名称排序
 "    let Tlist_Use_Right_Window = 1 " 在右侧显示窗口 
  "   let Tlist_Compart_Format = 1 " 压缩方式 
   "  let Tlist_Exist_OnlyWindow = 1 " 如果只有一个buffer，kill窗口也kill掉buffer 
   "  let Tlist_File_Fold_Auto_Close = 0 " 不要关闭其他文件的tags 
   "  let Tlist_Enable_Fold_Column = 0 " 不要显示折叠树 
   "  autocmd FileType java set tags+=~/document/ctagsdir
   "  autocmd FileType h,cpp,cc,c set tags+=~/document/ctagsdir
   "  let Tlist_Show_One_File=1 "不同时显示多个文件的tag，只显示当前文件的
    " 设置tags 
   "  set tags=tags 
   "  set autochdir
     """""""""""""""""""""""""
     "其他东东
     """""""""""""""""""""""""
     "默认打开Taglist 
   " let Tlist_Auto_Open=1 
     """""""""""""""""""""""""""""" 
     " Tag list (ctags) 
     """""""""""""""""""""""""""""""" 
"     let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
 "    let Tlist_Show_One_File = 1 "不同时显示多个文件的tag，只显示当前文件的 
  "   let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口，则退出vim 
   "  let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口

     " minibufexpl插件的一般设置
"    let g:miniBufExplMapWindowNavVim = 1
"    let g:miniBufExplMapWindowNavArrows = 1
"    let g:miniBufExplMapCTabSwitchBufs = 1
"    let g:miniBufExplModSelTarget = 1





"""""""""""
""Tag list 
""""""""""""
"if MySys() == "windows"                
     "设定windows系统中ctags程序的位置
"     let Tlist_Ctags_Cmd = 'ctags'
"elseif MySys() == "linux"              
     "设定linux系统中ctags程序的位置
"     let Tlist_Ctags_Cmd = '/**usr/**bin/**ctags'
"endif
"let Tlist_Show_One_File = 1            
"不同时显示多个文件的tag，只显示当前文件的
"let Tlist_Exit_OnlyWindow = 1          
"如果taglist窗口是最后一个窗口，则退出vim
"let Tlist_Use_Right_Window = 1         
"在右侧窗口中显示taglist窗口 





autocmd FileType java set omnifunc=javacomplete#Complete                   
autocmd Filetype java set completefunc=javacomplete#CompleteParamsInf 

inoremap <buffer> <C-X><C-U> <C-X><C-U><C-P> 
inoremap <buffer> <C-S-Space> <C-X><C-U><C-P>

autocmd Filetype java,javascript,jsp inoremap <buffer>  .  .<C-X><C-O><C-P>

"set tags=/mnt/oristar_sms_server_v1.0_20140905/
"set autochdir
"
let Tlist_Ctags_Cmd='ctags' " 因为我们放在环境变量里，所以可以直接执行
let Tlist_Use_Right_Window=1 " 让窗口显示在右边，0的话就是显示在左边
let Tlist_Show_One_File=1 "让taglist可以同时展示多个文件的函数列表，如果想只有1个，设置为1
let Tlist_File_Fold_Auto_Close=1 " 非当前文件，函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 " 当taglist是最后一个分割窗口时，自动推出vim
let Tlist_Process_File_Always=0 "是否一直处理tags.1:处理;0:不处理。不是一直实时更新tags，因为没有必要
let Tlist_WinWidth=40 "设定Tlist的宽度




"我的NERDTree配置
let NERDChristmasTree=1
let NERDTreeAutoCenter=1
let NERDTreeBookmarksFile=$VIM.'\Data\NerdBookmarks.txt'
let NERDTreeMouseMode=2
let NERDTreeShowBookmarks=1
let NERDTreeShowFiles=1
let NERDTreeShowHidden=1
let NERDTreeShowLineNumbers=1
let NERDTreeWinPos='left'
let NERDTreeWinSize=31
nnoremap f :NERDTreeToggle










"添加快捷注释
:nnoremap <F12> "=strftime("// auther:huangkui \n//type:modify start \n//time:%Y-%m-%d %H:%M:%S")<CR>gP

:nnoremap <F9> "=strftime("// auther:huangkui \n//type:modify  end \n//time:%Y-%m-%d %H:%M:%S")<CR>gP
"   call append(line(".")+3, " # Created Time: ".strftime("%Y-%m-%d")) 
